package models;
/**
 * Klasa wyjatku dla klasy Karta.
 */
class KartaException extends Exception {
    /**
     * Stala stosowana przy deserializacji (elipse sie czepia o jej brak).
     */
    private static final long serialVersionUID = 148932875105817586L;

    /**
     * Konstuktor tworzacy komunikat bledu.
     * 
     * @param komunikat komunikat bledu
     */
	public KartaException(final String komunikat) {
		super(komunikat);
        }
}
/**
 * Klasa reprezentujaca pojedzyncza karte.
 */
public class Karta implements Comparable<Karta> {
    /**
     * Figura karty.
     */
    private int figura;
    /**
     * Kolor karty.
     */
    private int kolor;
    /**
     * Maksymalna mozliwa figura. 
     */
    private static final int MAKS_FIGURA = 15;
    /**
     * Maksymalna mozliwa figura w postaci liczby (nie np J).
     */
    private static final int MAKS_FIGURA_LICZBA = 11;
    /**
     * Maksymalny mozliwy kolor.
     */
    private static final int MAKS_KOLOR = 4;
    /**
     * Kod odpowiadajacy figurze J.
     */
    private static final int J = 11;
    /**
     * Kod odpowiadajacy figurze Q.
     */
    private static final int Q = 12;
    /**
     * Kod odpowiadajacy figurze K.
     */
    private static final int K = 13;
    /**
     * Kod odpowiadajacy figurze A.
     */
    private static final int A = 14;
    /**
     * Kod odpowiadajacy kolorowi SPADE.
     */
    private static final int SPADE = 0;
    /**
     * Kod odpowiadajacy kolorowi HEART.
     */
    private static final int HEART = 1;
    /**
     * Kod odpowiadajacy kolorowi DIAMOND.
     */
    private static final int DIAMOND = 2;
    /**
     * Kod odpowiadajacy kolorowi CLUB.
     */
    private static final int CLUB = 3;
    /**
     * Konstruktor tworzacy nowa karte na podstawie podanego koloru i fugury.
     * 
     * @param fig figura karty
     * @param kol kolor karty
     * @throws KartaException wyjatek rzucany 
     * w wypadku niepoprawnej figury lub koloru
     */
    public Karta(final int fig, final int kol) throws KartaException {
    	boolean poprawnoscFigury = fig > 1 && fig < MAKS_FIGURA;
        boolean poprawnoscKoloru = kol >= 0 && kol < MAKS_KOLOR;
        
       if (poprawnoscFigury && poprawnoscKoloru) {
            this.figura = fig;
            this.kolor = kol;
       } else {
            throw new KartaException("niepoprawna karta lub kolor");
       }
    }
    /**
     * Metoda zwracajaca wartosc karty jako String.
     * 
     * @return wartosc karty jako String
     */
    public final String pobierzWartoscKarty() {
        String wartosc = "";
       
        if (figura > 1 && figura < MAKS_FIGURA_LICZBA) {
            wartosc += figura;
        } else {
            switch (figura) {
            case A : wartosc = "A"; break;
            case J : wartosc = "J"; break;
            case Q : wartosc = "Q"; break;
            case K : wartosc = "K"; break;
            default : break;
            }
        }
        return wartosc;
    }
    /**
     * Metoda zwracajaca kolor jako String.
     * 
     * @return kolor jako String
     */
    private String pobierzKolor() {
        String kolorKarty = "";
         
        switch(kolor) {
        case SPADE : kolorKarty = "s"; break;
        case HEART : kolorKarty = "h"; break;
        case DIAMOND : kolorKarty = "d"; break;
        case CLUB : kolorKarty = "c"; break;
        default : break;
        }
        return kolorKarty;
    }
    /**
     * Metoda zwracajaca kod koloru.
     * 
     * @return kod koloru
     */
    public final int pobierzKodKoloru() {
        return kolor;
    }
    /**
     * Metoda zwracajaca kod figury.
     * 
     * @return kod figury
     */
    public final int pobierzKodFigury() {
    	return figura;
    }
    /**
     * Metoda pozwalajaca na wypisanie karty jako String.
     * 
     * @return figura i wartosc karty jako String
     */
    public final String toString() {
        return pobierzWartoscKarty() + " " + pobierzKolor();
    }
    
    /**
     *  Metoda porownujaca dwie karty.
     *  
     *  @param karta karta do porownania
     *  @return 0 jesli karty sa rowne, 
     *  liczbe wieksza od zera jesli karta na ktorej wywolano jest silniejsza 
     *  lub liczbe mniejsza od zera jesli karta w parametrze jest silniejsza
     */
    public final int compareTo(final Karta karta) {
        return figura - karta.figura;
    }
}